package main

import (
    "github.com/pkg/errors"
    "database/sql"
)

type User struct {
	ID   int64  `sql:"column:id"`
	Name string `sql:"column:name"`
}

// 我们在数据库操作的时候，比如 dao 层中当遇到一个 sql.ErrNoRows 的时候，是否应该 Wrap 这个 error，抛给上层。为什么，应该怎么做请写出代码？

//数据层操作 dao 
func GetUserInfo(db *sql.DB)(*[]User, error) {
    rows, err := db.Query(`SELECT * FROM users`)
	defer rows.Close()
	if err != nil {
		return nil, errors.Wrap(err, "get userInfo failed")
	}
    var users []User
	for rows.Next() {
		var user User
		err := rows.Scan(&user.ID, &user.Name)
		if err != nil {
            if err == sql.ErrNoRows {
                return "", errors.Wrap(err, "data is nil")
            }
			return nil, errors.Wrap(err, "read from db err")
		}
		users = append(users, user)
	}

	return &users, nil
}


// func main() {
//    id = 1
//    username, err := GetInfo(id)
//    if err != nil {
//        fmt.Println("sql.ErrNoRows")
//    }
//    fmt.Println("username is :%s", username)
// }

// func GetInfo(id int)(name string, err errors) {
//     var name string
  

//    err := db.QueryRow("select name from user_info where id = ? ", id).Scan(&name)
//    if err != nil {
//        if err == sql.ErrNoRows {
//            fmt.Println("sql.ErrNoRows")
//            return "", errors.Wrap(err, "data is nil")
//        }
//        return "", err
//    }
//    return name, nil
// }